package com.fps.webshop.question.question0001_0099;

/**
 * 6. Z 字形变换
 * 
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 * 
 * 请你实现这个将字符串进行指定行数变换的函数：
 * 
 * string convert(string s, int numRows);

 * 示例 1：
 * 输入：s = "PAYPALISHIRING", numRows = 3
 * 输出："PAHNAPLSIIGYIR"
 * 
 * 示例 2：
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 输出："PINALSIGYAHRPI"
 * 解释：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 * 
 * 示例 3：
 * 输入：s = "A", numRows = 1
 * 输出："A"
 * 
 * 提示：
 * 		1 <= s.length <= 1000
 * 		s 由英文字母（小写和大写）、',' 和 '.' 组成
 * 		1 <= numRows <= 1000
 */
public class Question006 {

	/**
	 * 第一次提交，感觉有点问题，还对单行做了特殊处理，遍历了两次数组，耗时极大
	 * 没有归纳数学规律，暴力解决
	 * 提交结果	执行用时	内存消耗	语言		提交时间				备注 
	 * 通过 		66 ms	40.7 MB	Java	2021/08/05 16:21
	 */
	public static String convert(String s, int numRows) {
		if(numRows==1) {
			return s;
		}
		
		int sNums = s.length();
		char[] sChars = s.toCharArray();
		int nowAt = 0;
		
		int count = s.length();
		char[][] cows= new char[numRows][count];
		int tik = 0;
		Boolean fullrow = true;
		for(int j=0;j<count;j++) {
			for(int i=0;i<numRows;i++) {
				if(nowAt>=sNums) {
					break;
				}
				if(fullrow&&((tik>0&&i>0)||(i==0&&tik==0))) {
					tik++;
					cows[i][j] = sChars[nowAt];
					nowAt++;
					if(tik==numRows) {
						fullrow=false;
						tik--;
						tik--;
					}
				}else {
					if(tik==0) {
						fullrow=true;
						continue;
					}
					if(i==tik) {
						cows[tik][j] = sChars[nowAt];
						tik--;
						nowAt++;
					}
				}
			}
		}
		StringBuffer word = new StringBuffer();
		for(int i=0;i<numRows;i++) {
			for(int j=0;j<count;j++) {
				if(cows[i][j]!='\u0000') {
					word.append(cows[i][j]);
				}
			}
		}
		
		return word.toString();
		
    }
	
	public static void main(String[] args) {
		String s = "AB";
		int rows = 1;
		System.out.print(convert(s,rows));
	}

}
